# 积分管理模块：负责积分的新增、更新、保存、查询
import json
import os
from datetime import datetime
from config.settings import STUDENT_SCORE_FILE, REPEAT_SCORE_INTERVAL

# 全局变量：存储学生积分（格式：{"姓名": 分数}）
student_scores = {}

def init_scores(student_names):
    """初始化积分（新学生默认0分，已有学生保留原有分数）"""
    global student_scores
    # 加载已有积分（如果文件存在）
    if os.path.exists(STUDENT_SCORE_FILE):
        with open(STUDENT_SCORE_FILE, 'r', encoding='utf-8') as f:
            student_scores = json.load(f)
    
    # 为新学生初始化积分（未在积分文件中的学生）
    for name in student_names:
        if name not in student_scores:
            student_scores[name] = 0
    
    # 保存初始化后的积分
    save_scores()
    print(f"✅ 积分初始化完成：{student_scores}")

def save_scores():
    """保存积分到本地JSON文件"""
    # 确保data文件夹存在（避免文件路径错误）
    os.makedirs(os.path.dirname(STUDENT_SCORE_FILE), exist_ok=True)
    with open(STUDENT_SCORE_FILE, 'w', encoding='utf-8') as f:
        json.dump(student_scores, f, ensure_ascii=False, indent=2)

def update_score(name, action, score=1):
    """
    更新学生积分
    :param name: 学生姓名
    :param action: 操作类型（"add"加分，"subtract"减分）
    :param score: 变动分数（默认1分）
    :return: 反馈信息（如“已为张三加1分，当前积分5分”）
    """
    global student_scores
    if name not in student_scores:
        return f"❌ 未找到学生{name}，积分更新失败"
    
    # 计算新积分（减分不低于0）
    if action == "add":
        student_scores[name] += score
    elif action == "subtract":
        student_scores[name] = max(0, student_scores[name] - score)
    else:
        return f"❌ 操作类型错误，仅支持加分或减分"
    
    # 保存更新后的积分
    save_scores()
    feedback = f"✅ 已为{name}{'加' if action == 'add' else '减'}{score}分，当前积分{student_scores[name]}分"
    return feedback

def get_top_scores(count=5):
    """获取积分排行前N名的学生（默认前5名）"""
    # 按积分降序排序
    sorted_scores = sorted(student_scores.items(), key=lambda x: x[1], reverse=True)[:count]
    return sorted_scores

def check_repeat_update(name, last_update):
    """检查是否重复更新积分（避免10秒内同一人重复操作）"""
    current_time = datetime.now()
    if (current_time - last_update["time"]).total_seconds() > REPEAT_SCORE_INTERVAL or last_update["name"] != name:
        return True  # 可以更新
    return False  # 重复更新，拒绝